package aerolinea

import org.junit.Before
import org.junit.Test
import servicios.AbstractHibernateTest
import servicios.Busqueda
import servicios.Criterio
import servicios.CriterioCompuesto
import servicios.CriterioSimple

class BusquedaTest extends AbstractHibernateTest{
	var Busqueda busqueda
	var Criterio criterio1
	var Criterio criterio2
	var Criterio criterio3
	var OrdenBusqueda ordenMenorPrecio
	var OrdenBusqueda ordenMenosEscalas
	var OrdenBusqueda ordenMenorDuracion
	
	@Before
	override void setUp() throws Exception{
		cargarTablas
		busqueda= new Busqueda()
		criterio1= busqueda.guardarCriterio(new CriterioSimple("asiento.categoria", "=", 'Primera')=>[id=12])
		criterio2= busqueda.guardarCriterio(new CriterioSimple("asiento.categoria", "=", "Turista")=>[id=13])
		criterio3= busqueda.guardarCriterio(new CriterioCompuesto(criterio1, criterio2, "OR")=>[id=14])
		ordenMenorPrecio= new MenorCosto
		ordenMenosEscalas= new MenosEscalas
		ordenMenorDuracion= new MenorDuracion
	}
	
	@Test
	def void testConsultarCriterioSimple() throws Exception{
		var criterioRes= busqueda.consultarCriterio(13)
		assertEquals(criterio2.id, criterioRes.id)
	}
	
	@Test
	def void testConsultarCriterioCompuesto() throws Exception{
		var criterioRes= busqueda.consultarCriterio(14)
		assertEquals(criterio3.id, criterioRes.id)
	}
	
	
	@Test
	def void testBusquedaPorAerolineaCriterioSimpleOrdenMenorCosto() throws Exception {
		criterio1= busqueda.guardarCriterio(new CriterioSimple("aerolinea.nombre", "=", "'AA'")=>[id=12])
		val vuelosRes= busqueda.buscarPor(criterio1, ordenMenorPrecio)
		assertEquals(4, vuelosRes.size)
		//Orden 3,4,1,2
		assertEquals(3, vuelosRes.get(0).id)
		assertEquals(4, vuelosRes.get(1).id)
		assertEquals(1, vuelosRes.get(2).id)
		assertEquals(2, vuelosRes.get(3).id)
	}
	
	@Test
	def void testBusquedaPorAerolineaCriterioSimpleOrdenMenosEscalas() throws Exception {
		criterio1= busqueda.guardarCriterio(new CriterioSimple("aerolinea.nombre", "=", "'AA'")=>[id=12])
		val vuelosRes= busqueda.buscarPor(criterio1, ordenMenosEscalas)
		assertEquals(4, vuelosRes.size)
	}
	
	@Test
	def void testBusquedaPorCategoriaAsientoCriterioSimpleOrdenMenorDuracion() throws Exception {
		criterio1= busqueda.guardarCriterio(new CriterioSimple("categoria.nombre", "=", "'Turista'")=>[id=12])
		val vuelosRes= busqueda.buscarPor(criterio1, ordenMenorDuracion)
		assertEquals(3, vuelosRes.size)
	}
	
	@Test
	def void testBusquedaPorOrigenTramoCriterioSimple() throws Exception {
		criterio1= busqueda.guardarCriterio(new CriterioSimple("tramo.idTramo.origenID", "=", "'Venezuela'")=>[id=12])
		val vuelosRes= busqueda.buscarPor(criterio1, ordenMenorPrecio)
		assertEquals(1, vuelosRes.size)
	}
	
	@Test
	def void testBusquedaPorDestinoTramoCriterioSimple() throws Exception {
		criterio1= busqueda.guardarCriterio(new CriterioSimple("tramo.idTramo.destinoID", "=", "'Argentina'")=>[id=12])
		val vuelosRes= busqueda.buscarPor(criterio1, ordenMenorPrecio)
		assertEquals(3, vuelosRes.size)
	}
	
	@Test
	def void testBusquedaPorAsientoCategoriaCriterioCompuesto() throws Exception {
		val vuelosRes= busqueda.buscarPor(criterio3, ordenMenorPrecio)
		assertEquals(6, vuelosRes.size)
	}
	
	@Test
	def void testConsultarCriterioSimpleYBuscar(){
		criterio1= busqueda.consultarCriterio(12)
		val vuelosRes= busqueda.buscarPor(criterio1, ordenMenorPrecio)
		assertEquals(3, vuelosRes.size)
	}
	
	@Test
	def void testConsultarCriterioCompuestoYBuscar(){
		criterio3= busqueda.consultarCriterio(14)
		val vuelosRes= busqueda.buscarPor(criterio3, ordenMenorPrecio)
		assertEquals(6, vuelosRes.size)
	}
	
}